package com.kpf.springcloud.service.impl;

import com.kpf.springcloud.common.ResponseEnum;
import com.kpf.springcloud.exception.BusinessException;
import com.kpf.springcloud.mapper.TopicCollectMapper;
import com.kpf.springcloud.pojo.KpfTopic;
import com.kpf.springcloud.pojo.KpfTopicCollect;
import com.kpf.springcloud.service.IKpfTopicCollectService;
import com.kpf.springcloud.service.IKpfTopicService;
import com.kpf.springcloud.service.ITokenService;
import com.kpf.springcloud.utils.GeneralUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author shiwen
 * @date 2021/3/7
 */
@Service
public class KpfTopicCollectServiceImpl extends BaseServiceImpl<TopicCollectMapper, KpfTopicCollect> implements IKpfTopicCollectService {

    @Autowired
    private ITokenService tokenService;

    @Autowired
    private IKpfTopicService topicService;

    /**
     * 收藏帖子内容
     *
     * @param topicId
     * @param collectStatus
     */
    @Override
    public void collectTopic(int topicId, int collectStatus) {
        String token = tokenService.verifyToken();
        if ("TOKEN_EXPIRED".equals(token)) {
            throw new BusinessException(ResponseEnum.TOKEN_EXPIRED);
        }
        int userId = Integer.parseInt(token.split("-")[0]);
        KpfTopicCollect kpfTopicCollect = getOne(getInitQueryWrapper().eq(KpfTopicCollect::getTopicId, topicId)
                .eq(KpfTopicCollect::getUserId, userId));
        if (collectStatus == 1) {
            // 收藏帖子, 判断是否有数据, 无数据直接save, 有数据将已有数据update为已收藏
            if (GeneralUtil.isObjNull(kpfTopicCollect)) {
                // 无数据直接save
                KpfTopicCollect build = KpfTopicCollect.builder().topicId(topicId).collectStatus(collectStatus).userId(userId).build();
                save(build);
                // 收藏数 + 1
                KpfTopic kpfTopic = topicService.getById(topicId);
                if (GeneralUtil.isObjNotNull(kpfTopic)) {
                    kpfTopic.setCollectNum(kpfTopic.getCollectNum() + 1);
                    // 收藏数 + 1
                    topicService.update(kpfTopic, topicService.getLambdaUpdateWrapper().eq(KpfTopic::getId, topicId));
                }
            } else {
                // 已取消收藏则改为已收藏
                if (kpfTopicCollect.getCollectStatus() != 1) {
                    kpfTopicCollect.setCollectStatus(collectStatus);
                    updateById(kpfTopicCollect);
                    KpfTopic kpfTopic = topicService.getById(topicId);
                    if (GeneralUtil.isObjNotNull(kpfTopic)) {
                        kpfTopic.setCollectNum(kpfTopic.getCollectNum() + 1);
                        // 收藏数 + 1
                        topicService.update(kpfTopic, topicService.getLambdaUpdateWrapper().eq(KpfTopic::getId, topicId));
                    }
                }
            }
        } else {
            // 收藏帖子, 取消收藏, 则直接收藏数 - 1
            if (GeneralUtil.isObjNotNull(kpfTopicCollect)) {
                kpfTopicCollect.setCollectStatus(collectStatus);
                updateById(kpfTopicCollect);
                KpfTopic kpfTopic = topicService.getById(topicId);
                if (GeneralUtil.isObjNotNull(kpfTopic)) {
                    kpfTopic.setCollectNum(kpfTopic.getCollectNum() - 1);
                    // 收藏数 + 1
                    topicService.update(kpfTopic, topicService.getLambdaUpdateWrapper().eq(KpfTopic::getId, topicId));
                }
            }
        }
    }

    @Override
    public List<KpfTopic> getCollectListByUserId() {
        String token = tokenService.verifyToken();
        if ("TOKEN_EXPIRED".equals(token)) {
            throw new BusinessException(ResponseEnum.TOKEN_EXPIRED);
        }
        int userId = Integer.parseInt(token.split("-")[0]);
        // 获取已收藏的帖子列表
        List<KpfTopicCollect> kpfTopicCollectList = list(getInitQueryWrapper().eq(KpfTopicCollect::getUserId, userId)
                .eq(KpfTopicCollect::getCollectStatus, 1));
        if (GeneralUtil.isListNotNull(kpfTopicCollectList)) {
            List<Integer> topicIdList = kpfTopicCollectList.stream().map(KpfTopicCollect::getTopicId).collect(Collectors.toList());
            List<KpfTopic> kpfTopicList = topicService.list(topicService.getInitQueryWrapper().eq(KpfTopic::getIsDelete, 0)
                    .in(KpfTopic::getId, topicIdList));
            return kpfTopicList;
        }
        return new ArrayList<>();
    }

}